// Main script for module '--- TALK TO PEOPLE ---'
/*	like Zak: MONOLOG, NOT DIALOG. Just react to people. Goal: fast game: Zak with walkthrough + no mazes.
									If they MUST talk:	BEST: person only appears in cutscenes.asc
														OR: talk then walk (or talk then repeat)
	TRUST YOUR GUT: 	IS THE CHARACTER EASY TO WRITE? INTERESTING, UNIQUE, FLOWS WITH THE STORY?
						If not, replace the dialog with a comment. Rush the user to the good stuff instead.
*/
//---------------------------------------------------------------------------------------
function tNote(){translatorHelp ="X ********** TRANSLATOR: 'TALK TO' CODE STARTS HERE: THESE ARE NOT ESSENTIAL CLUES, SO IT DOESN'T MATTER IF YOU CHANGE CONVERSATIONS A LITTLE BIT. ********";}
//---------------------------------------------------------------------------------------
var rcWho;
var lookRememberGroup;	var rcPosition[600];  //  allows new_person() to be called 100 times, or 100 x 6 'ln' values. Typicaly 30 in 'eventCheck (' and 30 calling 'new_person' directly
var startLine;			var tempLine;
function lookRemember(n)		// last number used: 63
{		lookRememberGroup =n; 			// needed for when you update the last remembered line
    setFriends(storyStar, rcWho);			// in case "lk"' uses "$"
		startLine = rcPosition[n];	tempLine = 0;	}
//---------------------------------------------------------------------------------------
function lk( what, notToWho)// questioner starts conversation. notToWho = do not talk to this person (it makes no sense)
{	tempLine++;
	if(!withinEventRange) return false;			// set by 'betweenEvents'
	if(notToWho){if(rcWho ==notToWho)return false;} // e.g. "what do you think of notToWho"? - make no snese if said to notToWho
	if(tempLine <= startLine) return false;						// all previous lines have alneady been used (or their events have passed), but later lines might be OK.
	else {	say2(storyStar,what);
			rcPosition[lookRememberGroup] =tempLine;	// next time, start on next line
			return true;	}
	return false;	}		// still here? Must be false then.
function lkLoopTo( toWhat, what)// 'toWhat' can be negative (relative number) or positive (absolute)
{	if(!withinEventRange){	tempLine++; return false;}		// set by 'betweenEvents'
	if(tempLine >=startLine)
	{	say2(storyStar,what);
		if(toWhat <0)// must be relative?
				rcPosition[lookRememberGroup] =rcPosition[lookRememberGroup] + toWhat; // next time, start on that line
		else	rcPosition[lookRememberGroup] = toWhat; // next time, start on that line
		return true;	}
}
function lkLoop( what){ say2(storyStar,what); return true; }	// just say it, and keep saying it
var ln; 						// used for incrementing 'lookRemember(n)' group so each 'lk' group has a different number
								// changed inside brackets for each line;
								// changed outside brackets in 'new_person' (so that outside brackets keeps right numbers)
								// note 'eventCheck': each event is treated as a new person)
var personStartln; // ln where each person starts. Cannot simply add from previous person, as 'ln' is incremented INSIDE brackets
function new_person()
{	personStartln++; ln =personStartln * 6;	// up to 6 variables per person (call it again after 6 if they need more)

}
function eventCheck( event1, howClose, monolog) // is this event coming up soon? Then you'll need some clues
{ 	if(!monolog)                        // monologs do not use 'lk' numbers, use 'monologNum' instead
        new_person();			      	      // each event is treated as a new person. Skips forward 6 variables at a time
	lookRemember(ln);					            // decides the lookRememberGroup, and start line.
  if(event1 !=GAME_OVER_REMOVE_PEOPLE)  // this event never passes
  {if(eventDone(event1))return false;}  // no point in a hint for an event that has passed
	if(howClose <0)howClose = 0;          // default: during same event
	var timeToEvent = event1 - findFirstOpenEvent(); // if event is passed, this is negative
	if(timeToEvent >howClose)return false; return true;
}
//---------------------------------------------------------------------------------------
//
//
//---------------------------------------------------------------------------------------
function checkRightClickName()
{	lookRememberGroup =0; 		// if needed, reset by 'lookRemember( n)'
	personStartln =0; ln =0; 	// count 'look remember' - must count the same every time!
	var giveGenericClues =new Boolean(0);	// triggers the clue section at the end
// HERO_M: people ask what he wants, then swap speakers so that HE does the talking

//------------------------------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//						O N L Y    I N     C U T S C E N E S
//
//					(or brief exceptions handled by clues.asc)
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
// YOUTH_M (Albert)
//---------------------------------------------------------------

//------------------------------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//						M O S T L Y    R E U S E D
//
//					(i.e. dialog mostly ripped from other games)
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
new_person();
if(rcWho ==140)// chemist.
{	ln++;lookRemember(ln);
	if(lk(""))return true;
	if(genericJobTalk("generic shopkeeper"))return true; return false;
}
//------------------------------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//						T A L K    T H E N    G E N E R I C
//
//					(brief talk, then default to generic dialog)
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
if(rcWho <45)giveGenericClues =true; // handled at the end
new_person();
if(rcWho ==ESTABLISHMENT_M) // (Morcerf): shallow 
{	ln++;lookRemember(ln);
  if(!eventDone(REFIT_SHIP))// decides to become The Count
  { say2(storyStar, ""); return true;}
  if(betweenEvents(SAVE_ALBERT_FROM_BANDITS1, SAVE_ALBERT_FROM_BANDITS3))
  {  if(lk(""))return true; 
      if(lkLoop(""))return true; 
  }
}new_person();// extra: more than 5 replies
new_person();
if(rcWho ==ESTABLISHMENT_M)//same person, but different set of numbers
{	ln++;lookRemember(ln);
  if(eventDone(SAVE_ALBERT_FROM_BANDITS3))
  { if(lk(""))return true; 
    if(lkLoop("")){exitDefault(ESTABLISHMENT_M);return true;}
  }
}
//------------------------------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//						T A L K    T H E N    W A L K
//
//					(brief talk, then walk off or repeat 'too busy' etc.)
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//						F U L L   D I A L O G
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------------------------
new_person();
if(rcWho ==TUNNELLER)//  TUNNELLER (Abbe Faria)
{	ln++;lookRemember(ln);
	if(lk(""))return true;
  if(lkLoopTo(1, ""))return true;
}new_person(); // AGAIN because this person has MORE than 6 lines, so the next person must start further along
//------------------------------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//								G E N E R I C
//
//						(mostly clues for later events)
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------------------------
if(giveGenericClues)// !!!LAST PART OF FUNCTION!!!!!! because new_person is incremented INSIDE the function
{ 					// eventCheck INCLUDES new_ person, so jumps 6 lines ahead.


if(eventCheck(REMEMBER_VILLEFORT_NAPOLEONIC,1))// and not Villefort himself
{	if(lk(""))return true;//
}
//-------------------- still talking? Miscellaneous stuff from the book --------------------------------
new_person();if(eventDone(REFIT_SHIP)) // he is public? - then say this first
{ // generic person: new_person adds 6 people, but we only need 1
	if(lk(""))return true;
}new_person();if(eventDone(FIND_TREASURE_CORNER))
{	if(lk(""))return true;//
}new_person(); // AGAIN because this person has MORE than 6 lines, so the next person must start further along
//----------------------- still talking?? Generic talk - this loops ----------------------------------------

  genericJobTalk("odd jobs"); return true;

//---------------------------------------------------------------------------------------
} // end of generic clues

}	// end of function
//---------------------------------------------------------------------------------------
function followerSayAfterEntering() // any random comments
{	return false;				// still here? Must be no result.
}
//---------------------------------------------------------------------------------------
function talkTo()
{		// set variables ---------------------------
    rcWho = rcObjectPerson;                         // includes animals and rocks
    if(!canSpeak(rcWho)) return false;              // includes asleep
    if(character[rcWho].Room !=player.Room) return false;
    withinEventRange =true;							          	// by default: individual lines can call 'lkBetween' to restrict this
		startLine =0;	tempLine =0; lookRememberGroup =0;// if needed, reset by 'lookRemember( n)'
		if(sameResponseRegardless(rcWho)) return true;	// some people always say the same thing
		// special cases? ---------------------------------
		if(rcWho >0)
		{	if(checkRightClickName()) return true; 	      // the main code
		}else			// objects, OR characters pretending to be objects (e.g. hat,bucket,mattress)
		{	if(checkHotspot())return true; }			        // NOTE: MATTRESS etc. returns before setting 'rcPersonType' - SAFE
		return false;	// if false, ALWAYS goes to 'lookAt'
									// defaultFailresponse is handled by 'lookAt'
}
//---------------------------------------------------------------------------------------
var monolog[200];
var monologNum;
function mlg( event1, howClose, what)
{	monologNum++;
  var onlyOnce =new Boolean(1); if(howClose <-1)// -1 has a special meaning. Anything lower means "repeat"
                    {onlyOnce =false; howClose =0 -howClose;}
	if(monolog[monologNum] <1)
	{	if(eventCheck(event1,howClose,true))// eventcheck = not there, but close. 'true' = monolog = do not call 'new_person()' - this does not use 'ln' numbers
				{ sayOrThink(storyStar,what, 2);// 2 = type: no 'look at' comment after
         if(onlyOnce) monolog[monologNum]=1; 
         return true;}
	}return false;
}
//------------------------------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//						H E R O    M O N O L O G
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
function heroMonolog()// see 'spontaneouslyTalk(' triggered by 'sponCount'; in rep_ex
{	monologNum =0;	// so you get the same number each time
  setFriends(storyStar, storyStar); // talks to self
// for specific scenes
// restricted (not all are allowed)
if(mlg(GASP_FOR_AIR,0,""))return true;
if(player.Room ==38)return false; // no gentle monologs at this time!

if(mlg(FIND_ABBE_WALL,0,"I have to escape!"))return true;//
}



//------------------------------------------------------------------------------------------